{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n",
      "truck\n",
      "       frog        ship       plane         cat        ship         cat        frog       plane\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=800x100 at 0x11252F4E0>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#!/usr/bin/env python\n",
    "# -*- coding: utf-8 -*-\n",
    "# _Author_: xiaofeng\n",
    "# Date: 2018-06-03 15:00:32\n",
    "# Last Modified by: xiaofeng\n",
    "# Last Modified time: 2018-06-03 15:00:32\n",
    "from __future__ import print_function\n",
    "import torch as t\n",
    "import torchvision as tv\n",
    "import torchvision.transforms as transforms\n",
    "from torchvision.transforms import ToPILImage\n",
    "show = ToPILImage()\n",
    "\n",
    "transform = transforms.Compose([transforms.ToTensor(),\n",
    "                                transforms.Normalize((0.5, 0.5, 0.5),\n",
    "                                                     (0.5, 0.5, 0.5))])\n",
    "trainset = tv.datasets.CIFAR10(\n",
    "    root='/Users/xiaofeng/Code/Github/dataset/test_datasets/cifar/', train=True, download=True,\n",
    "    transform=transform)\n",
    "trainloader = t.utils.data.DataLoader(trainset, batch_size=8, shuffle=True, num_workers=1)\n",
    "testset = tv.datasets.CIFAR10(\n",
    "    root='/Users/xiaofeng/Code/Github/dataset/test_datasets/cifar/', train=False, download=True,\n",
    "    transform=transform)\n",
    "testloader = t.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=1)\n",
    "classes = ('plane', 'car', 'bird', 'cat',\n",
    "           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n",
    "\n",
    "(data, label) = trainset[50]\n",
    "print(classes[label])\n",
    "\n",
    "# (data + 1) / 2是为了还原被归一化的数据\n",
    "show((data + 1) / 2).resize((100, 100))\n",
    "\n",
    "dataiter = iter(trainloader)\n",
    "images, labels = dataiter.next()\n",
    "print(' '.join('%11s' % classes[labels[j]] for j in range(8)))\n",
    "show(tv.utils.make_grid((images + 1) / 2)).resize((800, 100))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Net(\n",
      "  (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\n",
      "  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n",
      "  (fc1): Linear(in_features=400, out_features=120, bias=True)\n",
      "  (fc2): Linear(in_features=120, out_features=84, bias=True)\n",
      "  (fc3): Linear(in_features=84, out_features=10, bias=True)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(3, 6, 5) \n",
    "        self.conv2 = nn.Conv2d(6, 16, 5)  \n",
    "        self.fc1   = nn.Linear(16*5*5, 120)  \n",
    "        self.fc2   = nn.Linear(120, 84)\n",
    "        self.fc3   = nn.Linear(84, 10)\n",
    "\n",
    "    def forward(self, x): \n",
    "        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) \n",
    "        x = F.max_pool2d(F.relu(self.conv2(x)), 2) \n",
    "        x = x.view(x.size()[0], -1) \n",
    "        x = F.relu(self.fc1(x))\n",
    "        x = F.relu(self.fc2(x))\n",
    "        x = self.fc3(x)        \n",
    "        return x\n",
    "\n",
    "\n",
    "net = Net()\n",
    "print(net)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch import optim\n",
    "from torch.autograd import Variable\n",
    "criterion = nn.CrossEntropyLoss() # 交叉熵损失函数\n",
    "optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1,  2000] loss: 2.304\n",
      "[1,  4000] loss: 2.304\n",
      "[1,  6000] loss: 2.304\n",
      "[2,  2000] loss: 2.304\n",
      "[2,  4000] loss: 2.304\n",
      "[2,  6000] loss: 2.304\n",
      "Finished Training\n"
     ]
    }
   ],
   "source": [
    "t.set_num_threads(8)\n",
    "for epoch in range(2):  \n",
    "    \n",
    "    running_loss = 0.0\n",
    "    for i, data in enumerate(trainloader, 0):\n",
    "        \n",
    "        # 输入数据\n",
    "        inputs, labels = data\n",
    "        inputs, labels = Variable(inputs), Variable(labels)\n",
    "        \n",
    "        # 梯度清零\n",
    "        optimizer.zero_grad()\n",
    "        \n",
    "        # forward + backward \n",
    "        outputs = net(inputs)\n",
    "        loss = criterion(outputs, labels)\n",
    "        loss.backward()   \n",
    "        \n",
    "        # 更新参数 \n",
    "        optimizer.step()\n",
    "        \n",
    "        # 打印log信息\n",
    "        running_loss += loss.data[0]\n",
    "        if i % 2000 == 1999: # 每2000个batch打印一下训练状态\n",
    "            print('[%d, %5d] loss: %.3f' \\\n",
    "                  % (epoch+1, i+1, running_loss / 2000))\n",
    "            running_loss = 0.0\n",
    "print('Finished Training')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
